﻿//using HongYeSystemWebApi.Templet.Entity.Model;
//using HongYeSystemWebApi.Templet.Service;
//using SqlSugar;
//using System;
//using System.Collections.Generic;
//using System.ComponentModel.DataAnnotations.Schema;
//using System.Data.Common;
//using System.Linq.Expressions;
//using System.Text;
//using System.Threading.Tasks;

//namespace HongYeSystemWebApi.Templet.Core.Data
//{
//    public class Repository<TEntity, TKey> : IRepository<TEntity, TKey> where TEntity : BaseEntity  
//    {
//        private readonly SqlSugarClient SqlSugars;
//        public Repository(IHelpDB db)
//        {
//             SqlSugars = db.OpenDB();
//        }
//        public SqlSugarClient _SqlSugars
//        {
//            get { return SqlSugars; }
//        }
//        public virtual long Insert(TEntity entity, DbTransaction dbTransaction = null)
//        {
//            var temp = SqlSugars.Insertable(entity);
//            if (dbTransaction != null)
//            {
//                temp = temp.WithTransaction(dbTransaction);
//            }
//            return temp.ExecuteIdentity();
//        }

//        public virtual async Task<long> InsertAsync(TEntity entity, DbTransaction dbTransaction = null)
//        {
//            var temp = SqlSugars.Insertable(entity)
//            if (dbTransaction != null)
//            {
//                temp = temp.WithTransaction(dbTransaction);
//            }
//            return await temp.ExecuteIdentityAsync();
//        }

//        public virtual long Insert(List<TEntity> entities, DbTransaction dbTransaction = null)
//        {
//            var temp = SqlSugars.Insert(entities);
//            if (dbTransaction != null)
//            {
//                temp = temp.WithTransaction(dbTransaction);
//            }
//            return temp.ExecuteIdentity();
//        }

//        public virtual async Task<long> InsertAsync(List<TEntity> entities, DbTransaction dbTransaction = null)
//        {
//            var temp = SqlSugars.Insert(entities);
//            if (dbTransaction != null)
//            {
//                temp = temp.WithTransaction(dbTransaction);
//            }
//            return await temp.ExecuteAffrowsAsync();
//        }

//        public virtual int Delete(TKey id, DbTransaction dbTransaction = null)
//        {
//            var temp = SqlSugars.Update<TEntity>(id).Set(x => x.IsDeleted, true).Set(x => x.UpdateTime, DateTime.Now);
//            if (dbTransaction != null)
//            {
//                temp = temp.WithTransaction(dbTransaction);
//            }
//            return temp.ExecuteAffrows();
//        }

//        public virtual async Task<int> DeleteAsync(TKey id, DbTransaction dbTransaction = null)
//        {
//            var temp = SqlSugars.Update<TEntity>(id).Set(x => x., true).Set(x => x.UpdateTime, DateTime.Now);
//            if (dbTransaction != null)
//            {
//                temp = temp.WithTransaction(dbTransaction);
//            }
//            return await temp.ExecuteAffrowsAsync();
//        }

//        public virtual int Delete(List<TEntity> entities, DbTransaction dbTransaction = null)
//        {
//            var temp = SqlSugars.Update<TEntity>();
//            if (dbTransaction != null)
//            {
//                temp = temp.WithTransaction(dbTransaction);
//            }
//            return temp.SetSource(entities).Set(x => x.IsDeleted, true).Set(x => x.UpdateTime, DateTime.Now).ExecuteAffrows();
//        }

//        public virtual Task<int> DeleteAsync(List<TEntity> entities, DbTransaction dbTransaction = null)
//        {
//            var temp = SqlSugars.Update<TEntity>();
//            if (dbTransaction != null)
//            {
//                temp = temp.WithTransaction(dbTransaction);
//            }
//            return temp.SetSource(entities).Set(x => x.IsDeleted, true).Set(x => x.UpdateTime, DateTime.Now).ExecuteAffrowsAsync();
//        }

//        public virtual int HardDelete(TKey id, DbTransaction dbTransaction = null)
//        {
//            var temp = SqlSugars.Delete<TEntity>(id);
//            if (dbTransaction != null)
//            {
//                temp = temp.WithTransaction(dbTransaction);
//            }
//            return temp.ExecuteAffrows();
//        }

//        public virtual async Task<int> HardDeleteAsync(TKey id, DbTransaction dbTransaction = null)
//        {
//            var temp = SqlSugars.Delete<TEntity>(id);
//            if (dbTransaction != null)
//            {
//                temp = temp.WithTransaction(dbTransaction);
//            }
//            return await temp.ExecuteAffrowsAsync();
//        }

//        public virtual int HardDelete(Expression<Func<TEntity, bool>> whereLambda = null, DbTransaction dbTransaction = null)
//        {
//            var temp = SqlSugars.Delete<TEntity>();
//            if (dbTransaction != null)
//            {
//                temp = temp.WithTransaction(dbTransaction);
//            }
//            if (whereLambda != null)
//            {
//                temp = temp.Where(whereLambda);
//            }
//            return temp.ExecuteAffrows();
//        }

//        public virtual async Task<int> HardDeleteAsync(Expression<Func<TEntity, bool>> whereLambda = null, DbTransaction dbTransaction = null)
//        {
//            var temp = SqlSugars.Delete<TEntity>();
//            if (dbTransaction != null)
//            {
//                temp = temp.WithTransaction(dbTransaction);
//            }
//            if (whereLambda != null)
//            {
//                temp = temp.Where(whereLambda);
//            }
//            return await temp.ExecuteAffrowsAsync();
//        }

//        public virtual TEntity GetById(TKey id)
//        {
//            return SqlSugars.Select<TEntity>().Where(x => x.Id.Equals(id)).ToOne();
//        }

//        public virtual async Task<TEntity> GetByIdAsync(TKey id)
//        {
//            return await SqlSugars.Select<TEntity>().Where(x => x.Id.Equals(id)).ToOneAsync();
//        }

//        public virtual int Update(TEntity entity, DbTransaction dbTransaction = null)
//        {
//            entity.UpdateTime = DateTime.Now;
//            var temp = SqlSugars.Update<TEntity>().SetSource(entity)
//                .IgnoreColumns(x => new { x.CreateTime, x.IsDeleted });
//            if (dbTransaction != null)
//            {
//                temp = temp.WithTransaction(dbTransaction);
//            }
//            return temp.ExecuteAffrows();
//        }

//        public virtual async Task<int> UpdateAsync(TEntity entity, DbTransaction dbTransaction = null)
//        {
//            entity.UpdateTime = DateTime.Now;
//            var temp = SqlSugars.Update<TEntity>().SetSource(entity)
//                .IgnoreColumns(x => new { x.CreateTime, x.IsDeleted }); ;
//            if (dbTransaction != null)
//            {
//                temp = temp.WithTransaction(dbTransaction);
//            }
//            return await temp.ExecuteAffrowsAsync();
//        }

//        public virtual int Update(List<TEntity> entities, DbTransaction dbTransaction = null)
//        {
//            DateTime nowTime = DateTime.Now;
//            entities.ForEach(x =>
//            {
//                x.UpdateTime = DateTime.Now;
//            });
//            var temp = SqlSugars.Update<TEntity>();
//            if (dbTransaction != null)
//            {
//                temp = temp.WithTransaction(dbTransaction);
//            }
//            return temp.SetSource(entities).IgnoreColumns(x => new { x.Id, x.IsDeleted, x.CreateTime }).ExecuteAffrows();
//        }

//        public virtual async Task<int> UpdateAsync(List<TEntity> entities, DbTransaction dbTransaction = null)
//        {
//            DateTime nowTime = DateTime.Now;
//            entities.ForEach(x =>
//            {
//                x.UpdateTime = nowTime;
//            });
//            var temp = SqlSugars.Update<TEntity>();
//            if (dbTransaction != null)
//            {
//                temp = temp.WithTransaction(dbTransaction);
//            }
//            return await temp.SetSource(entities).IgnoreColumns(x => new { x.Id, x.IsDeleted, x.CreateTime }).ExecuteAffrowsAsync();
//        }

//        public virtual (List<TEntity> data, long total) GetList<TCloumn>(int pageNumber, int pageSize, Expression<Func<TEntity, bool>> whereLambda
//            , Expression<Func<TEntity, TCloumn>> orderbyLambda, bool isAes)
//        {
//            var temp = SqlSugars.Select<TEntity>().Where(whereLambda);
//            if (isAes)
//            {
//                temp = temp.OrderBy(orderbyLambda);
//            }
//            else
//            {
//                temp = temp.OrderByDescending(orderbyLambda);
//            }
//            var data = temp.Count(out long total).Page(pageNumber, pageSize).ToList();
//            return (data, total);
//        }

//        public virtual async Task<(List<TEntity> data, long total)> GetListAsync<TColumn>(int pageNumber, int pageSize, Expression<Func<TEntity, bool>> whereLambda
//            , Expression<Func<TEntity, TColumn>> orderbyLambda, bool isAes)
//        {
//            var temp = SqlSugars.Select<TEntity>();
//            if (whereLambda != null)
//            {
//                temp = temp.Where(whereLambda);
//            }
//            if (isAes)
//            {
//                temp = temp.OrderBy(orderbyLambda);
//            }
//            else
//            {
//                temp = temp.OrderByDescending(orderbyLambda);
//            }
//            var data = await temp.Count(out long total).Page(pageNumber, pageSize).ToListAsync();
//            return (data, total);
//        }

//        public virtual async Task<(List<TEntity> data, long total)> GetListAsync(int pageNumber, int pageSize, Expression<Func<TEntity, bool>> whereLambda
//          , Dictionary<string, bool> orderByProperties)
//        {
//            var temp = SqlSugars.Select<TEntity>();
//            if (whereLambda != null)
//            {
//                temp = temp.Where(whereLambda);
//            }
//            if (orderByProperties != null)
//            {
//                foreach (var orderByProperty in orderByProperties)
//                {
//                    temp = temp.OrderByPropertyName(orderByProperty.Key, orderByProperty.Value);
//                }
//            }
//            var data = await temp.Count(out long total).Page(pageNumber, pageSize).ToListAsync();
//            return (data, total);
//        }

//        public virtual TEntity Get(Expression<Func<TEntity, bool>> whereLambda)
//        {
//            var temp = SqlSugars.Select<TEntity>();
//            if (whereLambda != null)
//            {
//                temp = temp.Where(whereLambda);
//            }
//            return temp.First();
//        }

//        public virtual async Task<TEntity> GetAsync(Expression<Func<TEntity, bool>> whereLambda)
//        {
//            var temp = SqlSugars.Select<TEntity>();
//            if (whereLambda != null)
//            {
//                temp = temp.Where(whereLambda);
//            }
//            return await temp.FirstAsync();
//        }

//        public virtual long GetCount(Expression<Func<TEntity, bool>> whereLambda = null)
//        {
//            var temp = SqlSugars.Select<TEntity>();
//            if (whereLambda != null)
//            {
//                temp = temp.Where(whereLambda);
//            }
//            return temp.Count();
//        }

//        public virtual async Task<long> GetCountAsync(Expression<Func<TEntity, bool>> whereLambda = null)
//        {
//            var temp = SqlSugars.Select<TEntity>();
//            if (whereLambda != null)
//            {
//                temp = temp.Where(whereLambda);
//            }
//            return await temp.CountAsync();
//        }

//        public virtual List<TEntity> GetList(Expression<Func<TEntity, bool>> whereLambda = null)
//        {
//            var temp = SqlSugars.Select<TEntity>();
//            if (whereLambda != null)
//            {
//                temp = temp.Where(whereLambda);
//            }
//            return temp.ToList();
//        }

//        public virtual async Task<List<TEntity>> GetListAsync(Expression<Func<TEntity, bool>> whereLambda = null)
//        {
//            var temp = SqlSugars.Select<TEntity>();
//            if (whereLambda != null)
//            {
//                temp = temp.Where(whereLambda);
//            }
//            return await temp.ToListAsync();
//        }

//        public virtual List<TEntity> GetListWithSql(string sql)
//        {
//            return SqlSugars.Select<TEntity>().WithSql(sql).ToList();
//        }

//        public virtual async Task<List<TEntity>> GetListWithSqlAsync(string sql)
//        {
//            return await SqlSugars.Select<TEntity>().WithSql(sql).ToListAsync();
//        }

//        public virtual string GetTableName()
//        {
//            return ((TableAttribute)typeof(TEntity).GetCustomAttributes(typeof(TableAttribute), false)[0]).Name;
//        }

//        public virtual string GetTableName<T>()
//        {
//            return ((TableAttribute)typeof(T).GetCustomAttributes(typeof(TableAttribute), false)[0]).Name;
//        }


//        public virtual Task<string> GetTableNameAsync()
//        {
//            return Task.Run(() =>
//            {
//                return ((TableAttribute)typeof(TEntity).GetCustomAttributes(typeof(TableAttribute), false)[0]).Name;
//            });
//        }
//    }
//}
